package com.rs.game.npc.qbd;

import java.util.Iterator;

import com.rs.game.ForceTalk;
import com.rs.game.npc.NPC;
import com.rs.game.player.Player;
import com.rs.game.tasks.WorldTask;
import com.rs.game.tasks.WorldTasksManager;
import com.rs.utils.Utils;

/**
 * Handles the Queen Black Dragon's time stop attack.
 * 
 * @author Emperor
 * 
 */
public final class TimeStopAttack implements QueenAttack {

    /**
     * The messages the soul says.
     */
    private static final ForceTalk[] MESSAGES = { new ForceTalk("Kill me, mortal... quickly! HURRY! BEFORE THE SPELL IS COMPLETE!"), new ForceTalk("Time is short!"), new ForceTalk("She is pouring her energy into me... hurry!"), new ForceTalk("The spell is nearly complete!") };

    @Override
    public int attack(final QueenBlackDragon npc, final Player victim) {
	for (Iterator<TorturedSoul> it = npc.getSouls().iterator(); it.hasNext();) {
	    TorturedSoul soul = it.next();
	    if (soul.isDead()) {
		it.remove();
	    }
	}
	if (npc.getSouls().isEmpty()) {
	    return 1;
	}
	final TorturedSoul soul = npc.getSouls().get(Utils.random(npc.getSouls().size()));
	soul.setNextWorldTile(Utils.random(2) == 0 ? npc.getBase().transform(24, 28, 0) : npc.getBase().transform(42, 28, 0));
	soul.setNextGraphics(TorturedSoul.TELEPORT_GRAPHIC);
	soul.setNextAnimation(TorturedSoul.TELEPORT_ANIMATION);
	soul.setLocked(true);
	WorldTasksManager.schedule(new WorldTask() {
	    int stage = -1;

	    @Override
	    public void run() {
		stage++;
		if (stage == 8) {
		    stop();
		    npc.getTemporaryAttributes().put("_time_stop_atk", npc.getTicks() + Utils.random(50) + 40);
		    for (TorturedSoul s : npc.getSouls()) {
			s.setLocked(false);
		    }
		    for (NPC worm : npc.getWorms()) {
			worm.setLocked(false);
		    }
		    victim.unlock();
		    victim.getPackets().sendGlobalConfig(1925, 0);
		    return;
		} else if (stage == 4) {
		    for (TorturedSoul s : npc.getSouls()) {
			s.setLocked(true);
		    }
		    for (NPC worm : npc.getWorms()) {
			worm.setLocked(true);
		    }
		    victim.lock();
		    soul.setLocked(false);
		    victim.getPackets().sendGlobalConfig(1925, 1);
		    victim.getPackets().sendGameMessage("<col=33900>The tortured soul has stopped time for everyone except himself and the Queen Black</col>");
		    victim.getPackets().sendGameMessage("<col=33900>Dragon.</col>");
		    return;
		} else if (stage > 3) {
		    return;
		}
		if (soul.isDead()) {
		    stop();
		    return;
		}
		soul.setNextForceTalk(MESSAGES[stage]);
	    }
	}, 3, 3);
	npc.getTemporaryAttributes().put("_time_stop_atk", 9999999);
	return Utils.random(5, 10);
    }

    @Override
    public boolean canAttack(QueenBlackDragon npc, Player victim) {
	if (npc.getSouls().isEmpty()) {
	    return false;
	}
	Integer tick = (Integer) npc.getTemporaryAttributes().get("_time_stop_atk");
	return tick == null || tick < npc.getTicks();
    }

}